package com.reload.stream.intermediate;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @Date: 2024/4/24 下午4:39
 * @Version: 17
 * @Author: Reloading
 * @Description: 流的中间操作
 */
public class StreamIntermediate {
    /*
    filter 过滤 挑选出想要的元素
    map 映射 a 变成 b
    flatMap  打散、散列 一对多映射
     */
    public static void main(String[] args) {
        List<Person> list = List.of(
                new Person("雷 丰阳", "男", 16),
                new Person("王 五", "女", 20),
                new Person("赵 六", "男", 22),
                new Person("王 七", "女", 33),
                new Person("雷 二", "女", 18));

        // 拿到集合流其实就是拿到集合的深拷贝的值，流的所有操作都是流的元素引用
        // filter、map、flatMap； 流里面的每一个元素都完整走一个流水线，才能轮到下一个元素；
        // 第一个元素流经所有管道处理后，下一个元素才能继续执行完整管道流程
        list.stream()
                // 挑选出年龄大于18 -- 还是person流
                .filter(person -> person.getAge() > 18)
                // 相当检查操作
                .peek(s -> System.out.println("map peek:" + s))
                // 拿到所有人的姓名 变成了String流
                .map(persion -> persion.getName())
                .flatMap(ele -> {
                    String[] s = ele.split(" ");
                    return Arrays.stream(s);
                })
                // 去重
                .distinct()
                // 限制
                .limit(4)
                // 排序
                .sorted()
                // forEach是结束操作, peek是中间操作
                .forEach(System.out::println);

        // 关于 takeWhile
        List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
                .stream()
                .filter(i -> i > 3)
                .toList();

        // filter 是无条件遍历流中的每一个元素
        // takeWhile 当满足条件拿到这个元素,不满足条件直接结束
        List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
                .stream()
                .takeWhile(i -> i > 3)
                .toList();


        // groupingBy 分组操作
        Map<String, List<Person>> collect = list.stream()
                .filter(item -> item.getAge() > 18)
                .collect(Collectors.groupingBy(item -> item.getGender()));
        System.out.println("collect = " + collect);

        // 背压：
        // 正压：正向压力：数据的生产者给消费者压力；

    }

    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    static class Person {
        private String name;
        private String gender;
        private Integer age;
    }
}
